#pragma once

#include "database/mysql_pool.h"
#include <nlohmann/json.hpp>
#include <vector>
#include <string>
#include <map>

namespace cpp_backend
{
    namespace database
    {

        /**
         * @brief MySQL辅助类 - 提供便捷的SQL操作接口
         */
        class MySQLHelper
        {
        public:
            /**
             * @brief 执行查询SQL
             * @param sql SQL语句
             * @return 查询结果（JSON数组格式）
             */
            static nlohmann::json Query(const std::string &sql);

            /**
             * @brief 执行查询SQL（带参数）
             * @param sql SQL语句（使用?作为占位符）
             * @param params 参数列表
             * @return 查询结果（JSON数组格式）
             */
            static nlohmann::json QueryWithParams(const std::string &sql,
                                                  const std::vector<std::string> &params);

            /**
             * @brief 执行更新SQL（INSERT/UPDATE/DELETE）
             * @param sql SQL语句
             * @return 影响的行数，失败返回-1
             */
            static int Execute(const std::string &sql);

            /**
             * @brief 执行更新SQL（带参数）
             * @param sql SQL语句（使用?作为占位符）
             * @param params 参数列表
             * @return 影响的行数，失败返回-1
             */
            static int ExecuteWithParams(const std::string &sql,
                                         const std::vector<std::string> &params);

            /**
             * @brief 执行INSERT并返回插入的ID
             * @param sql INSERT语句
             * @return 插入的ID，失败返回-1
             */
            static int64_t Insert(const std::string &sql);

            /**
             * @brief 执行INSERT并返回插入的ID（带参数）
             * @param sql INSERT语句（使用?作为占位符）
             * @param params 参数列表
             * @return 插入的ID，失败返回-1
             */
            static int64_t InsertWithParams(const std::string &sql,
                                            const std::vector<std::string> &params);

            /**
             * @brief 开始事务
             * @param conn 连接对象
             */
            static bool BeginTransaction(sql::Connection *conn);

            /**
             * @brief 提交事务
             * @param conn 连接对象
             */
            static bool Commit(sql::Connection *conn);

            /**
             * @brief 回滚事务
             * @param conn 连接对象
             */
            static bool Rollback(sql::Connection *conn);

            /**
             * @brief 批量插入数据
             * @param table 表名
             * @param fields 字段列表
             * @param values 值列表（每行是一个vector）
             * @return 成功插入的行数
             */
            static int BatchInsert(const std::string &table,
                                   const std::vector<std::string> &fields,
                                   const std::vector<std::vector<std::string>> &values);

        private:
            /**
             * @brief ResultSet转JSON
             */
            static nlohmann::json ResultSetToJson(sql::ResultSet *res);
        };

        /**
         * @brief RAII事务管理器
         */
        class MySQLTransaction
        {
        public:
            explicit MySQLTransaction(sql::Connection *conn);
            ~MySQLTransaction();

            /**
             * @brief 提交事务
             */
            void Commit();

            /**
             * @brief 回滚事务
             */
            void Rollback();

            /**
             * @brief 获取连接
             */
            sql::Connection *GetConnection() { return conn_; }

        private:
            sql::Connection *conn_;
            bool committed_;
            bool rolled_back_;
        };

    } // namespace database
} // namespace file_server
